// 题目要求：
// 给定一个二维数组，长度为 n，宽度为 m
// 每一个位置都能上下左右四个位置搜索
// 如果 grid[i][j] > grid[x][y]，就能从 (i, j) 走到 (x, y)
// 问能走的最长路径

// 解题思路：
// 需要遍历每一个位置，从每一个位置出发能走的最长路径，里面的最大值就是要求的结果
// 求每一个位置的最长路径，可以通过 dfs 搜索，搜到的结果取最大值
// 因为会涉及到大量重复的搜索，因此可以创建备忘录，进行记忆化搜索
// 每次搜索之前先查备忘录，如果不为 0，可以直接返回
// 如果为 0，搜索完得到结论后，返回前将该值存到备忘录里面

import java.util.*;


public class MemoSearch {
    public static int n = 0;
    public static int m = 0;
    public static int[][] grid;
    public static int[] dx = {0, 0, 1, -1};
    public static int[] dy = {1, -1, 0, 0};
    public static int[][] memo;

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        n = in.nextInt();
        m = in.nextInt();

        grid = new int[n][m];
        memo = new int[n][m];


        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                grid[i][j] = in.nextInt();
            }
        }

        int ret = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                ret = Math.max(ret, dfs(i, j));
            }
        }

        System.out.println(ret);
    }

    public static int dfs(int i, int j){
        if(memo[i][j] != 0){
            return memo[i][j];
        }
        int ret = 1;
        for(int k = 0; k < 4; k++){
            int x = i + dx[k];
            int y = j + dy[k];

            if(x >= 0 && x < n && y >= 0 && y < m && grid[x][y] < grid[i][j]){
                ret = Math.max(ret, dfs(x, y) + 1);
            }
        }

        memo[i][j] = ret;
        return ret;
    }
}
